GitHub Apps と add-to-project アクションで、リポジトリに作成された Issues を Projects に自動追加するワークフローを作成してみた

GitHub Apps と add-to-project アクションで、リポジトリに作成された Issues を Projects に自動追加するワークフローを作成してみた

Clock Icon2024.08.11

こんにちは、製造ビジネステクノロジー部の若槻です。

GitHub で add-to-project アクションを使うと、Issues やプルリクエストを自動的に Projects に追加するワークフローを簡単に作成することができます。

https://github.com/actions/add-to-project

今回は、GitHub Apps と add-to-project アクションで、リポジトリに作成された Issues を Projects に自動追加するワークフローを作成してみました。

PAT の利用は組織で制限されている可能性がある

PAT (Personal Access Token) は GitHub の API にアクセスするための認証トークンですが、古いタイプのトークンであり権限の粒度が粗いため、組織での利用が制限されている場合があります。
https://docs.github.com/ja/organizations/managing-programmatic-access-to-your-organization/setting-a-personal-access-token-policy-for-your-organization#personal-access-tokens-classic-によるアクセスの制限

利用が制限されている組織で PAT を使って API にアクセスをすると以下のようなエラーが発生します。

$  curl -H "Authorization: token $GITHUB_TOKEN" -H "Accept: application/vnd.github.v3+json" "$API_ENDPOINT/repos/$ORGANIZATION_NAME/$REPO_NAME/issues?state=open"
{
  "message": "`classmethod-internal` forbids access via a personal access token (classic). Please use a GitHub App, OAuth App, or a personal access token with fine-grained permissions.",
  "documentation_url": "https://docs.github.com/rest/issues/issues#list-repository-issues",
  "status": "403"
}

ここで、リポジトリに作成された Issues を Projects に自動追加するワークフローを簡単に作成できるアクションである add-to-project では、認証トークンとして PAT を利用した下記のようなワークフローのサンプルが README に記載されています。

name: Add issue to project

on:
  issues:
    types:
      - opened

jobs:
  add-to-project:
    name: Add issue to project
    runs-on: ubuntu-latest
    steps:
      - uses: actions/add-to-[email protected]
        with:
          project-url: https://github.com/orgs/classmethod-internal/projects/1
          github-token: ${{ secrets.ADD_TO_PROJECT_PAT }}

しかし、組織で PAT の利用が制限されている場合、このサンプルをそのまま利用することはできません。

PAT を GitHub Apps に置き換えてみた

そこで、今回のブログの目的でもある「使用する認証トークンを PAT から、GitHub Apps で取得したトークンに置き換えたワークフロー」を作成してみます。

GitHub Apps の作成およびインストール

GitHub.com で https://github.com/settings/apps より、次の権限を持つ GitHub Apps を作成します。

権限レベル Read/Write 権限内容
リポジトリ Read issues and metadata
組織 Read & Write organization projects
アカウント - -

ここで、Apps は本来ならリポジトリが作成されている組織に作成するべきでしょうが、今回は一旦個人アカウントに作成しました。

Apps のインストール時の権限のリクエストは、Issues の追加元リポジトリおよび、Issues の追加先の Projects の組織に対して行います。ちなみに、組織に対して権限をリクエストする場合は、組織のオーナー権限が必要です。

オーナーにより権限のリクエストが許可されたら、リポジトリに Apps がインストールされます。

変数及びシークレットの設定

先ほど作成した GitHub Apps の App ID をリポジトリの変数に、秘密鍵をシークレットに設定します。

今回は APP_IDPRIVATE_KEY という名前で設定しました。

ワークフロー

次のようなワークフローを作成します。

.github/workflows/add-issue-to-project.yml
name: Add issue to project

on:
  issues:
    types:
      - opened

jobs:
  add-to-project:
    name: Add issue to project
    runs-on: ubuntu-latest
    steps:
      - uses: actions/create-github-app-token@v1
        id: create-github-app-token
        with:
          app-id: ${{ vars.APP_ID }}
          private-key: ${{ secrets.PRIVATE_KEY }}

      - uses: actions/add-to-[email protected]
        with:
          project-url: https://github.com/orgs/classmethod-internal/projects/1
          github-token: ${{ steps.create-github-app-token.outputs.token }}

create-github-app-token アクションを使うと、GitHub Apps でトークンを取得することができます。
https://github.com/actions/create-github-app-token

取得したトークンを PAT の代わりに add-to-project アクションに渡すことで、リポジトリに作成された Issues を Projects に自動追加するようにしています。

動作確認

リポジトリに適当な Issue を作成すると、ワークフローが実行されました。

ワークフローにより Issues が Projects の No status カラム(指定が無い場合は既定でこのカラムとなる)に追加されました!

おわりに

GitHub Apps と add-to-project アクションで、リポジトリに作成された Issues を Projects に自動追加するワークフローを作成してみました。

add-to-project もですが、create-github-app-token アクションもなかなか便利ですね。GitHub Apps でトークンを取得する際には実質必須のアクションとなりそうなので、PAT が classic な機能として今後の利用が非推奨となっていく中で、お世話になる場面が増えていきそうです。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.